package com.cmonbaby.adapter.listview;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.cmonbaby.adapter.listview.base.BaseLViewAdapter;
import com.cmonbaby.adapter.listview.base.LItem;
import com.cmonbaby.adapter.listview.base.LItemManager;

import java.util.List;

/**
 * ListView多条目形式适配器
 * @author simon 2016-9-13 上午11:16:29
 * @since JDK1.8 SDK6.0.1
 * @version V2.3.4
 * @param <T>
 */
public class LMultiItemTypeAdapter<T> extends BaseLViewAdapter<T> {

    private LItemManager<T> mLItemManager; // 条目管理

    /**
     * 构造方法，其中初始化了条目管理：new LItemManager()
     * @param datas 数据源
     */
    public LMultiItemTypeAdapter(List<T> datas) {
        super(datas);
        mLItemManager = new LItemManager<>();
    }

    /**
     * 增加一种item条目样式
     * @param lItem item条目对象
     * @return LMultiItemTypeAdapter
     */
    protected LMultiItemTypeAdapter addItemViewStyles(LItem<T> lItem) {
        mLItemManager.addStyle(lItem);
        return this;
    }

    protected LMultiItemTypeAdapter addItemViewStyles(int viewType, LItem<T> rItem) {
        mLItemManager.addStyle(viewType, rItem);
        return this;
    }

    /** 是否使用item条目样式 */
    private boolean useItemViewStyleManager() {
        return mLItemManager.getItemViewStyleCount() > 0;
    }

    /** 返回所有的layout样式的数量 */
    @Override
    public int getViewTypeCount() {
        if (useItemViewStyleManager())
            return mLItemManager.getItemViewStyleCount();
        return super.getViewTypeCount();
    }

    /** 根据数据源的position返回需要显示的的layout的type，type的值必须从0开始 */
    @Override
    public int getItemViewType(int position) {
        if (useItemViewStyleManager()) return mLItemManager.getItemViewType(super.mDatas.get(position), position);
        return super.getItemViewType(position);
    }

    /** 每绘制一个Item条目就会调用一次getView方法 */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LItem lItem = mLItemManager.getListViewItemView(super.mDatas.get(position), position);
        int layoutId = lItem.getItemViewLayoutId(); // 获取item条目布局ID
        LViewHolder lViewHolder;
        if (convertView == null) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent,
                    false);
            // 构造方法做了：itemView.setTag(this);
            lViewHolder = new LViewHolder(parent.getContext(), itemView, parent, position);
            lViewHolder.mLayoutId = layoutId; // 可不用赋值，仅用于getLayoutId()
            // 当视图创建，未做数据绑定时的回调，可重写实现
            onViewHolderCreated(lViewHolder, lViewHolder.getConvertView());
        } else {
            lViewHolder = (LViewHolder) convertView.getTag();
            lViewHolder.mPosition = position; // 可不用赋值，仅用于updatePosition()，getItemPosition()
        }

        // 视图与数据源绑定显示，有ViewHolder，T实体对象，条目位置
        convert(lViewHolder, getItem(position), position);
        return lViewHolder.getConvertView(); // 返回条目View视图，由ListViewViewHolder构造方法赋值
    }

    /**
     * 视图与数据源绑定显示，有ViewHolder，T实体对象，条目位置
     *
     * @param lViewHolder LViewHolder
     * @param item 数据源对象
     * @param position 数据源的position
     */
    protected void convert(LViewHolder lViewHolder, T item, int position) {
        mLItemManager.convert(lViewHolder, item, position);
    }

    /**
     * 当视图创建，未做数据绑定时的回调，可重写实现
     *
     * @param holder LViewHolder
     * @param itemView listViewViewHolder.getConvertView()
     */
    protected void onViewHolderCreated(LViewHolder holder, View itemView) {
    }

    /** 绘制ListView之前，将会先调用getCount方法来获取Item的个数 */
    @Override
    public int getCount() {
        return super.mDatas == null ? 0 : super.mDatas.size();
    }

    /** getItem返回的是该对象本身 */
    @Override
    public T getItem(int position) {
        return super.mDatas == null ? null : super.mDatas.get(position);
    }

    /** getItemID返回的是该对象的索引 */
    @Override
    public long getItemId(int position) {
        return position;
    }
}